class Solution(object):
    def robotSim(self, commands, obstacles):
        """
https://leetcode.cn/problems/walking-robot-simulation/description/


机器人在一个无限大小的 XY 网格平面上行走，从点 (0, 0) 处开始出发，面向北方。该机器人可以接收以下三种类型的命令 commands ：

    -2 ：向左转 90 度
    -1 ：向右转 90 度
    1 <= x <= 9 ：向前移动 x 个单位长度

在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位于网格点  obstacles[i] = (xi, yi) 。

机器人无法走到障碍物上，它将会停留在障碍物的前一个网格方块上，但仍然可以继续尝试进行该路线的其余部分。

返回从原点到机器人所有经过的路径点（坐标为整数）的最大欧式距离的平方。（即，如果距离为 5 ，则返回 25 ）
 

注意：

    北表示 +Y 方向。
    东表示 +X 方向。
    南表示 -Y 方向。
    西表示 -X 方向。



        :type commands: List[int]
        :type obstacles: List[List[int]]
        :rtype: int
        """

        all_blocks = {(b[0], b[1]) for b in obstacles}

        dirs = [(0,1), (1,0), (0,-1),(-1,0)]
        ans = 0

        dir = 0
        x = 0
        y = 0
        for c in commands:
            if c == -1:
                dir = (dir + 1) % 4
            elif c == -2:
                dir = (dir + 3) % 4
            else:
                for i in range(c):
                    nx = x + dirs[dir][0]
                    ny = y + dirs[dir][1]
                    if (nx, ny) in all_blocks:
                        break
                    x = nx
                    y = ny
                ans = max(ans, x * x + y * y)
        return ans
